=====================

Winsock API Tutorial Part 5

Written By

Mohamed Fayed

Thensync@hotmail.com

=====================

 

برمجة العميلClient

سيحتوي العميل على نفس الدوال الموجودة في mdlWinsock و mdlSubClass  لأننا سنعمل Hook على رسائل التي سيستقبلها مقبس العميل وسننشأ لها تصنيف فرعى يدعى Winsockmain أيضا كما هو موجود فى برنامج الخادم Server  وسنضيف الآن إلى مشروع العميل فورم باسم FrmClient ونضيف الأدوات الآتية :

 

خواص

الاسم

الأداة

_

Cmddisconnect

_

Cmdconnect

_

CmdSend

MultiLine=True

txtChat

_

txtSend

_

lblstatus

 

والشكل النهائي للتطبيق سيكون هكذا :

 

 

بالنسبة لكود frmClient سيكون كالتالي :

 

 

Dim LlistenSocket As Long, lRetVal As Long

 

Private Sub Form_Load()

    HookForm Me.hwnd

    If WinsockInitialize = True Then

        frmClient.lblStatus = "Winsock Service is Running"

    End If

 CmdDisconnect.Enabled = False

 CmdSend.Enabled = False

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

    UnHookForm Me.hwnd

    closesocket LlistenSocket

    WSACleanup

End Sub

 

 

 

Private Sub CmdConnect_Click()

Dim RemoteAddr As sockaddr_in

    LlistenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

      If LlistenSocket = INVALID_SOCKET Then

        frmClient.lblStatus = "Unable to Create Socket"

      Else

        RemoteAddr.sin_family = AF_INET

        RemoteAddr.sin_port = htons(CLng(2010))

        RemoteAddr.sin_addr = inet_addr("127.0.0.1")

    lRetVal = connect(LlistenSocket, RemoteAddr, Len(RemoteAddr))

     If lRetVal = SOCKET_ERROR Then

        frmClient.lblStatus = "Unable to Connect to Server"

     Else

    CmdConnect.Enabled = False

    CmdSend.Enabled = True 

    CmdDisconnect.Enabled = True

        End If

        WSAAsyncSelect LlistenSocket, Me.hwnd, ByVal WM_SOCKET, _

            ByVal FD_CONNECT Or FD_READ Or FD_CLOSE

    End If

End Sub

 

 

Private Sub cmdDisconnect_Click()

    lblStatus.Caption = "Dissconnected"

    If LlistenSocket <> INVALID_SOCKET Then closesocket LlistenSocket

    cmdConnect.Enabled = True

    cmdSend.Enabled = False

    cmdDisconnect.Enabled = False

End Sub

 

 

Private Sub cmdSend_Click()

    Dim Msg As String

    Msg = "Reply" & txtSend.Text & vbCrLf

    lRetVal = send(LlistenSocket, ByVal Msg, Len(Msg), 0)

    txtChat.Text = txtChat.Text & Msg

    txtSend.Text = ""

   

    If lRetVal = SOCKET_ERROR Then

      lblStatus = "Unable to Send Message"

    End If

End Sub

كما ترى معظم الاكواد قد رأيتها من قبل .

ومن خلال الدالة Connect() نستطيع الاتصال وهى شبيهه بالدالة bind لو كنت نسيت معاملاتها .فقط سنملئ بنية

RemoteAddr بالمعلومات اللازمة للاتصال بالطرف الأخر مثل عنوان الإنترنت والمنفذ وعنوان العائلة الذي نستخدمه.

 

RemoteAddr.sin_family = AF_INET

RemoteAddr.sin_port = htons(CLng(2010))

RemoteAddr.sin_addr = inet_addr(127.0.01)

 

lRetVal = connect(LlistenSocket, RemoteAddr, Len(RemoteAddr))

 

وبما أننا سنجرب البرنامج على الجهاز المحلى فنعطيه أل LoopBack IP  127.0.0.1)) وعلى المنفذ 2010 .

 

فقط سيكون هناك اختلاف بسيط في  الوحدة النمطية للتصنيف الفرعي  والخاص بالأجراء Winsockmain والذي يستقبل أحداث المقبس وهذا الاختلاف ناتج من أننا سنراقب الحدث FD_Connect بدلا من FD_Accept

فإذا استقبل المقبس الحدث FD_Connect فهذا يدل على أن الطرف الأخر قد وافق على الاتصال.

 

Public Function WinSockmain(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As _         

                                                  Long, ByVal lParam As Long) As Long

    If uMsg = WM_SOCKET Then

        Dim ReadBuffer(1024) As Byte, lRetVal As Long

       

        Select Case lParam

            Case FD_CONNECT

                frmClient.lblStatus.Caption = "You are Connected"

            Case FD_READ

                  Dim data As String

                  lRetVal = recv(wParam, ReadBuffer(0), 1024, 0)

                  If lRetVal > 0 Then

                       data = Left(StrConv(ReadBuffer, vbUnicode), lRetVal)

                      If Left(Data, 5) = "Reply" Then

                          Data = Right(Data, Len(Data) - 5) 

 

                       frmClient.txtChat.Text = frmClient.txtChat.Text & data

                       End If

                     End If

            Case FD_CLOSE

                  frmClient.lblStatus.Caption = "The Remote Machine Has Disconnected"

        End Select

   End If

  

   WinSockmain = CallWindowProc(lpPrevWndProc, hwnd, uMsg,wParam, lParam)

 

End Function

 

والآن أصبح كل من العميل والخادم جاهزان للاتصال وتبادل بيانات المحادثة.

 

=====================

Winsock API Tutorial Part 5

Written By

Mohamed Fayed

Thensync@hotmail.com

=====================

More Info Visit The source of Network Programming

www.vbip.com